package com.cwz.quartz.utils;

import com.cwz.api.entity.SysJob;
import org.quartz.JobExecutionContext;

/**
 * @program: w-demo
 * @description: 定时任务具体处理（并发执行）
 *  Quartz 定时任务默认都是并发执行的，不会等待上一次任务执行完毕，只要间隔时间到就会执行, 如果定时任执行太长，会长时间占用资源，导致其它任务堵塞。
 * 每次执行任务（定时执行 job）的时候生成的 JobDetail 都不是同一个实例的，此处生成的 JobDetail 是不一样的
 *
 * 注解：
 * 1. @PersistJobDataAfterExecution：告诉Quartz在成功执行了Job实现类的execute方法后（没有发生任何异常），
 * 更新JobDetail中JobDataMap的数据，使得该JobDetail实例在下一次执行的时候，JobDataMap中是更新后的数据，而不是更新前的旧数据，
 * 也就是说JobDataMap中的数据会被更新，比如用于计数，计数调用了多少次。
 *
 * 2. @DisallowConcurrentExecution：告诉Quartz不要并发地执行同一个JobDetail实例。
 *
 * 3. 如果你使用了@PersistJobDataAfterExecution注解，则强烈建议你同时使用@DisallowConcurrentExecution注解，
 * 因为当同一个job（JobDetail）的两个实例被并发执行时，由于竞争，JobDataMap中存储的数据很可能是不确定的。
 *
 * 4. 因为当前定时任务模块，每次执行的SysJob都不一样，所以就不需要加@PersistJobDataAfterExecution注解
 * @author: Wen
 **/
public class QuartzJobExecution extends AbstractQuartzJob {

	@Override
	protected void doExecute(JobExecutionContext context, SysJob sysJob) throws Exception {
		JobInvokeUtils.invokeMethod(sysJob);
	}
}
